package br.com.cfccultura.admin.control.actions.financeiro;

import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.springframework.stereotype.Component;

import br.com.cfccultura.admin.control.actions.DefaultAction;
import br.com.cfccultura.admin.control.forms.financeiro.ContaPagarForm;
import br.com.cfccultura.admin.model.vo.ContaPagar;
import br.com.cfccultura.admin.model.vo.Fornecedor;
import br.com.cfccultura.admin.model.vo.Movimento;
import br.com.cfccultura.admin.model.vo.MovimentoAnexo;

@Component("/contaPagar")
public class ContaPagarAction extends DefaultAction {
	
	private static final Logger logger = Logger.getLogger(ContaPagarAction.class); 
	
	public ActionForward iniciar(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {		
		
		ContaPagar filtro = new ContaPagar();
		filtro.setDataMenor(new Date());
		List<ContaPagar> vencido = getFluxoCaixaDAO().consulta(filtro);
		
		filtro = new ContaPagar();
		filtro.setVencimento(new Date());
		List<ContaPagar> vencer = getFluxoCaixaDAO().consulta(filtro);
		
		filtro = new ContaPagar();
		filtro.setDataMaior(new Date());
		List<ContaPagar> futuro = getFluxoCaixaDAO().consulta(filtro);
		
		if(vencido.size() > 0)
			request.setAttribute("vencido", vencido);
			double totalVencido = 0D;
			for(ContaPagar pagar : vencido) {
				totalVencido += pagar.getValor();
			}
			request.setAttribute("totalVencido", totalVencido);
		if(vencer.size() > 0) {
			request.setAttribute("vencer", vencer);
			double totalVencer = 0D;
			for(ContaPagar pagar : vencer) {
				totalVencer += pagar.getValor();
			}
			request.setAttribute("totalVencer", totalVencer);
		}
		if(futuro.size() > 0) {
			request.setAttribute("futuro", futuro);
			double totalFuturo = 0D;
			for(ContaPagar pagar : futuro) {
				totalFuturo += pagar.getValor();
			}
			request.setAttribute("totalFuturo", totalFuturo);
		}
		
		return mapping.findForward("body");
	}
	
	public ActionForward incluir(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		ContaPagarForm pagarForm = (ContaPagarForm) form;
		ContaPagar vo = new ContaPagar();
		
		vo.setFornecedor(new Fornecedor(pagarForm.getFornecedor()));
		vo.setVencimento(getDateFormat().parse(pagarForm.getDataVencimento()));
		vo.setValor(getDecimalFormat().parse(pagarForm.getValorPagamento()).doubleValue());
		vo.setDescricao(pagarForm.getDescricao());
		vo.setCadastro(new Date());
		vo.setUsuarioSistema(getUsuario(request));	
		
		getFluxoCaixaDAO().incluir(vo);
		
		Movimento movimento = getFluxoCaixaDAO().consultaMovimento(vo.getCodigo());
		Object[] params = {true, movimento.getCodigo()};
		
		printJsonObjectToStream(params, response);
		
		return null;
	}
	
	public ActionForward excluir(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		ContaPagarForm pagarForm = (ContaPagarForm) form;
		
		for(Integer conta : pagarForm.getContaPagar()) {
			getFluxoCaixaDAO().excluir(new ContaPagar(conta));
		}
		
		return null;
	}
	
	public ActionForward carregarRealizarPagamento(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		ContaPagarForm pagarForm = (ContaPagarForm) form;
		
		List<ContaPagar> contas = getFluxoCaixaDAO().consulta(new ContaPagar(pagarForm.getIdSelecionado()));
		ContaPagar conta = contas.get(0);
		
		List<MovimentoAnexo> anexos = getFluxoCaixaDAO().consultaAnexos(conta.getCodigo());
		
		request.setAttribute("conta", conta);
		if(anexos.size() > 0)
			request.setAttribute("anexos", anexos);
		
		return mapping.findForward("realizarPagamento");
	}
	
	public ActionForward detalhe(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		ContaPagarForm pagarForm = (ContaPagarForm) form;
		
		List<ContaPagar> contas = getFluxoCaixaDAO().consulta(new ContaPagar(pagarForm.getIdSelecionado()));
		ContaPagar conta = contas.get(0);
		
		List<MovimentoAnexo> anexos = getFluxoCaixaDAO().consultaAnexos(conta.getCodigo());
		
		request.setAttribute("conta", conta);
		if(anexos.size() > 0)
			request.setAttribute("anexos", anexos);
		
		return mapping.findForward("detalhe");
	}
	
	public ActionForward realizarPagamento(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		ContaPagarForm pagarForm = (ContaPagarForm) form;
		
		List<ContaPagar> contas = getFluxoCaixaDAO().consulta(new ContaPagar(pagarForm.getIdSelecionado()));
		ContaPagar vo = contas.get(0);
		
		vo.setPagamento(getDateFormat().parse(pagarForm.getDataPagamento()));
		vo.setValorPago(getDecimalFormat().parse(pagarForm.getValorPago()).doubleValue());
		
		getFluxoCaixaDAO().confirmarPagamento(vo);
		
		Movimento movimento = getFluxoCaixaDAO().consultaMovimento(vo.getCodigo());
		Object[] params = {true, movimento.getCodigo()};
		
		printJsonObjectToStream(params, response);
		
		return null;
	}
	
	public ActionForward carregarAlterarConta(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		ContaPagarForm pagarForm = (ContaPagarForm) form;
		
		List<ContaPagar> contas = getFluxoCaixaDAO().consulta(new ContaPagar(pagarForm.getIdSelecionado()));
		ContaPagar conta = contas.get(0);
		
		Object[] params = {
			true,
			conta.getFornecedor().getCodigo(),
			conta.getDescricao(),
			getDateFormat().format(conta.getVencimento()),
			getDecimalFormat().format(conta.getValor())
		};
		
		printJsonObjectToStream(params, response);
		
		return mapping.findForward("alterar");
	}
	
	public ActionForward alterar(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		ContaPagarForm pagarForm = (ContaPagarForm) form;
		ContaPagar vo = new ContaPagar();
		
		vo.setCodigo(pagarForm.getIdSelecionado());
		vo.setFornecedor(new Fornecedor(pagarForm.getFornecedor()));
		vo.setVencimento(getDateFormat().parse(pagarForm.getDataVencimento()));
		vo.setValor(getDecimalFormat().parse(pagarForm.getValorPagamento()).doubleValue());
		vo.setDescricao(pagarForm.getDescricao());
		vo.setCadastro(new Date());
		vo.setUsuarioSistema(getUsuario(request));	
		
		getFluxoCaixaDAO().alterar(vo);
		
		return null;
	}
	
	
}
